home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / snip9_91.arc / BASTRNGS.C < prev    next >
C/C++ Source or Header  |  1991-09-17  |  3KB  |  141 lines

  1. /*
  2. **  BASIC-like string operations
  3. **
  4. **  public domain by Bob Stout
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <stdlib.h>
  10. #include <stdarg.h>
  11. #include <assert.h>
  12.  
  13. static int stralloc_ptr;
  14. static char *strings[8];
  15. static int str_tag[8];
  16.  
  17. /*
  18. **  stralloc() is the key function in this package, maintaining a pool of
  19. **  reusable strings.
  20. */
  21.  
  22. char *stralloc(int length)
  23. {
  24.         register int i;
  25.  
  26.         i = stralloc_ptr++;
  27.         if ((!strings[i]) || (length > strlen(strings[i])))
  28.         {
  29.                 assert(strings[i] = (char *)realloc(strings[i], length));
  30.                 str_tag[i] = -1;
  31.         }
  32.         else    str_tag[i] = 0;
  33.         stralloc_ptr &= 7;
  34.         return (strings[i]);
  35.         /* Maintains 8 strings in a circular buffer */
  36. }
  37.  
  38. /*
  39. **  free the string pool.
  40. */
  41.  
  42. str_free(char *string)
  43. {
  44.         register int i;
  45.  
  46.         for (i = 0; i < 8; ++i)
  47.         {
  48.                 if (strings[i] == string)
  49.                 {
  50.                         if (str_tag[i])
  51.                                 assert(!free(strings[i]));
  52.                         return;
  53.                 }
  54.         }
  55. }
  56.  
  57. /*
  58. **  return the leftmost N characters from a string
  59. */
  60.  
  61. char *left(char *string, int N)
  62. {
  63.         char *buf;
  64.         int strlength;
  65.         strlength = strlen(string);
  66.         if (N > strlength)
  67.                 N = strlength;
  68.         buf = stralloc(N + 1);
  69.         strncpy(buf, string, N);
  70.         buf[N] = '\0';
  71.         return buf;
  72. }
  73.  
  74. /*
  75. **  return the rightmost N characters from a string
  76. */
  77.  
  78. char *right(char *string, int N)
  79. {
  80.         char *buf;
  81.         int strlength;
  82.         strlength = strlen(string);
  83.         if (N > strlength)
  84.                 N = strlength;
  85.         buf = stralloc(N + 1);
  86.         strcpy(buf, &string[strlength-N]);
  87.         return buf;
  88. }
  89.  
  90. /*
  91. **  return a substring, N characters long beginning at position M
  92. */
  93.  
  94. char *mid(char *string, int M, int N)
  95. {
  96.         char *buf;
  97.         int strlength;
  98.         strlength = strlen(string);
  99.         if (M > strlength)
  100.                 return NULL;
  101.         if (N > (strlength - M))
  102.                 N = strlength - M;
  103.         buf = stralloc(N + 1);
  104.         strncpy(buf, &string[M-1], N);
  105.         buf[N] = '\0';
  106.         return buf;
  107. }
  108.  
  109. /*
  110. **  string concatenation function, equivalent to A$=B$+C$+...
  111. */
  112.  
  113. char *string_add(char *string, ...)
  114. {
  115.         va_list arg_ptr;
  116.         char *temp1, *temp2, *buf;
  117.  
  118.         va_start(arg_ptr, string);
  119.         temp1 = string;
  120.         do
  121.         {
  122.                 if(NULL == (temp2 = va_arg(arg_ptr, char *)))
  123.                         break;
  124.                 buf = stralloc(strlen(temp1) + strlen(temp2) + 1);
  125.                 temp1 = strcat(strcpy(buf, temp1), temp2);
  126.         } while (NULL != temp2);
  127.         return temp1;
  128. }
  129.  
  130. /*
  131. **  Demo main()
  132. */
  133.  
  134. main()
  135. {
  136.         char *x = "European", *y = "Hardware", *z = "Skaters";
  137.  
  138.         z = string_add(left(x, 2), right(y, 2), mid(z, 2, 2), "!", NULL);
  139.         puts(z);
  140. }
  141.